#include "Zuma.h"

using namespace std;

Zuma::Zuma(void)
{
	this->logger = LogFactory::getInstance()->getLog();
}

Zuma::~Zuma(void)
{
	if(this->root!=NULL)
		delete this->root;
}

void Zuma::initialize(string configFileName)
{
	try {
		this->logger->info(" ************** Iniciando Zuma ************** ");
		this->root = this->readConfiguration(configFileName);
		DomValidator * domValidator= new DomValidator("validator.txt");
		domValidator->validateDom((*root),this->logger);
		delete domValidator;
	}catch(XmlSintaxException se) {
		logger->error(se.getMessage());
		throw InitializationException(se.getMessage());
	}catch(XmlSemanticException e){
		logger->error(e.getMessage());
		throw InitializationException(e.getMessage());
	}catch(...) {
		logger->error("Error de inicializacion.");
		throw InitializationException("Error de inicializacion.");
	}

	DomainModelCreator* dmc = new DomainModelCreator();
	dmc->createDomainModel(this->root);

}

void Zuma::showElementByTag(string tag)
{
	try
	{
		logger->info("Comienza impresion de elementos con tag: "+tag);
		list<XMLElement*> query = root->getElementsByName(tag);
		list<XMLElement*>::iterator pointersIterator;		
		for(pointersIterator = query.begin(); pointersIterator != query.end(); ++pointersIterator)
		{
			XMLElement elem = (*(*pointersIterator));
			string elementInfo = elem.toString();
			logger->info(elementInfo);

			// muestra la informacion solicitada por consola
			cout << elementInfo;
		}
		logger->info("Termina impresion de elementos con tag: "+tag);
	}
	catch(XmlSintaxException e)
	{
		logger->error(e.getMessage());
	}
	catch(NoSuchXmlElementException e)
	{
		logger->error(e.getMessage());
		throw e;
	}
}

void Zuma::showElementById(string id)
{
	try
	{
		logger->info("Comienza impresion de elementos con id: "+id);
		XMLElement* query = root->getElementById(id);
		string elementInfo = query->toString();
		logger->info(elementInfo);

		// muestra la informacion solicitada por consola
		cout << elementInfo;

		logger->info("Termina impresion de elementos con id: "+id);
	}
	catch(XmlSintaxException e)
	{
		logger->error(e.getMessage());
		cout << "XmlSintaxException\n";
	}
	catch(NoSuchXmlElementException e)
	{
		logger->error(e.getMessage());
		throw e;
	}
}

XMLElement * Zuma::readConfiguration(string configurationFileName) {
	try {
		string msg = "Comenzando parseo archivo de configuracion : [";
		msg.append(configurationFileName);
		msg.append(1,']');
		logger->info(msg);

		Parser* parser = new Parser(XmlGrammar());
		XMLElement* root = parser->ParseFile(configurationFileName);
		logger->info("Parseo finalizado.");
		return root;
	} catch(XmlSintaxException e) {
		throw e;
	}
}
